/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.daten.struktur.tabelle.typ;

import de.mnit.basis.daten.struktur.gruppe.Gruppe3;
import de.mnit.basis.daten.struktur.liste.Liste;
import de.mnit.basis.daten.struktur.liste.S_Liste;
import de.mnit.basis.fehler.Fehler;

public class TypTabelle3<TA,TB,TC> extends A_TypTabelle<Gruppe3<TA,TB,TC>, S_Liste<?>> {

	private S_Liste<TA> spalte1;
	private S_Liste<TB> spalte2;
	private S_Liste<TC> spalte3;


	public TypTabelle3(Class<TA> ks1, Class<TB> ks2, Class<TC> ks3) {
		super(ks1, ks2, ks3);
		spalte1=Liste.neu();
		spalte2=Liste.neu();
		spalte3=Liste.neu();
	}


	public static <T1,T2,T3> TypTabelle3<T1,T2,T3> neu(Class<T1> k1, Class<T2> k2, Class<T3> k3) {
		return new TypTabelle3<T1, T2, T3>(k1, k2, k3);
	}

	// LESEN

	public int gBreite() {
		return 3;
	}

	public S_Liste<TA> gSpalte1()   { return this.spalte1.kopie(); }
	public S_Liste<TB> gSpalte2()   { return this.spalte2.kopie(); }
	public S_Liste<TC> gSpalte3()   { return this.spalte3.kopie(); }

	public Gruppe3<TA,TB,TC> gZeile(int zeile) {
		return Gruppe3.neu(spalte1.gib(zeile), spalte2.gib(zeile), spalte3.gib(zeile));
	}

	public S_Liste<?> gSpalte(int spalte) {
		if(spalte==1) return this.gSpalte1();
		if(spalte==2) return this.gSpalte2();
		if(spalte==3) return this.gSpalte3();
		throw Fehler.zahl.da_Ungueltig(spalte);
	}

	@SuppressWarnings("unchecked")
	public <T> S_Liste<T> gSpalte(int spalte, Class<T> typ) {
		if(spalte==1) return (S_Liste<T>)this.gSpalte1();
		if(spalte==2) return (S_Liste<T>)this.gSpalte2();
		if(spalte==3) return (S_Liste<T>)this.gSpalte3();
		throw Fehler.zahl.da_Ungueltig(spalte);
	}

	// AENDERN

	@SuppressWarnings("unchecked")
	protected void pSetze(int spalte, int zeile, Object objekt) {
		if(spalte==1) this.spalte1.setze(zeile, (TA)objekt);
		if(spalte==2) this.spalte2.setze(zeile, (TB)objekt);
		if(spalte==3) this.spalte3.setze(zeile, (TC)objekt);
	}

	@SuppressWarnings("unchecked")
	protected void pErsetzen(int zeile, Object[] objekte) {
		this.spalte1.setze(zeile, (TA)objekte[0]);
		this.spalte2.setze(zeile, (TB)objekte[1]);
		this.spalte3.setze(zeile, (TC)objekte[2]);
	}

	protected void pVertauschen(int zeile_a, int zeile_b) {
		this.spalte1.vertauschen(zeile_a, zeile_b);
		this.spalte2.vertauschen(zeile_a, zeile_b);
		this.spalte3.vertauschen(zeile_a, zeile_b);
	}

	@SuppressWarnings("unchecked")
	protected void pPlus(Object[] zeile)   {
		this.spalte1.plus((TA)zeile[0]);
		this.spalte2.plus((TB)zeile[1]);
		this.spalte3.plus((TC)zeile[2]);
	}

	@SuppressWarnings("unchecked")
	protected void pEinfuegen(int zeile, Object[] objekte) {
		this.spalte1.plus(zeile,(TA)objekte[0]);
		this.spalte2.plus(zeile,(TB)objekte[1]);
		this.spalte3.plus(zeile,(TC)objekte[2]);
	}

	protected void pMinus(int zeile) {
		this.spalte1.minus(zeile);
		this.spalte2.minus(zeile);
		this.spalte3.minus(zeile);
	}

}
